package com.hc.controller;

import com.hc.bean.Result;
import com.hc.bean.ResultUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@RestController
@RequestMapping("/goods")
public class GoodsController {
    /**
     * 需要在ShiroConfig中添加： filterChainDefinitionMap.put("/goods/index", "anon"); // 登录，可匿名访问
     *
     * @return
     */
    //@RequiresGuest //此注解可以省略
    @GetMapping(path = "/index")
    public Result index() {
        return ResultUtil.success("本次请求不需要授权");
    }

    /**
     * 代码授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @GetMapping("/list")
    public Result list() {
        Subject subject = SecurityUtils.getSubject();
        if (subject.isAuthenticated()) {
            return ResultUtil.success("已经登录成功");
        } else {
            return ResultUtil.fail(-1, "游客未登录");
        }
    }

    /**
     * 代码授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequestMapping("/save")
    public Result save() {
        Subject subject = SecurityUtils.getSubject();
        //基于角色
        if (subject.hasRole("user")) {
            return ResultUtil.success("成功增加商品");
        } else {
            return ResultUtil.fail("未登录，无权增加商品");
        }
    }

    /**
     * 代码授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequestMapping("/update")
    public Result update() {
        Subject subject = SecurityUtils.getSubject();
        //基于资源
        if (subject.isPermitted("goods:update:*")) {
            return ResultUtil.success("成功更新商品");
        } else {
            return ResultUtil.fail("无权更新商品");
        }
    }

    /**
     * 代码授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequestMapping("/find")
    public Result find() {
        Subject subject = SecurityUtils.getSubject();
        //基于资源
        if (subject.isPermitted("goods:find:*")) {
            return ResultUtil.success("成功查看商品");
        } else {
            return ResultUtil.fail("无权查看商品");
        }
    }

    /**
     * 注解授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     * 身份认证
     *
     * @return
     */
    @GetMapping("/fun1")
    @RequiresAuthentication
    public Result fun1() {
        return ResultUtil.success("已经被认证");
    }

    /**
     * 注解授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequiresUser
    @RequestMapping("/fun2")
    public Result fun2(HttpServletRequest req, HttpServletResponse resp) {
        return ResultUtil.success("requiresUser");
    }

    /**
     * 注解授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     * 角色认证
     * 有同时具备user角色，才能访问
     *
     * @return
     */
    @GetMapping("/delete")
    @RequiresRoles("user")
    public Result delete() {
        return ResultUtil.success("当前访问需要user角色");
    }

    /**
     * 注解授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequestMapping("/delete1")
    @RequiresRoles("admin") //基于角色
    public Result delete1() {
        return ResultUtil.success("成功删除商品1");
    }

    /**
     * 注解授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequestMapping("/delete2")
    @RequiresRoles(value = {"admin", "user"}, logical = Logical.OR) //基于角色
    public Result delete2() {
        return ResultUtil.success("成功删除商品2");
    }

    /**
     * 角色认证
     * 有同时具备admin,user两个角色，才能访问
     *
     * @return
     */
    @GetMapping("/delete3")
    @RequiresRoles(value = {"admin", "user"}, logical = Logical.AND)
    public Result delete3() {
        return ResultUtil.success("requiresRoles");
    }

    @GetMapping("/getGoods")
    @RequiresPermissions(value = {"goods:get"})
    public Result getGoods() {
        return ResultUtil.success("查询成功！");
    }

    /**
     * 注解授权
     * <p>
     * 测试步骤：先登录，成功之后，在地址栏输入这个路径再请求
     *
     * @return
     */
    @RequestMapping("/delete4")
    @RequiresPermissions("goods:delete:*") //基于资源
    public Result delete4() {
        return ResultUtil.success("成功删除商品3");
    }

    /**
     * 权限认证
     *
     * @return
     */
    @GetMapping("/getUpdate")
    @RequiresPermissions(value = {"goods:get", "goods:update"}, logical = Logical.AND)
    public Result getUpdate() {
        return ResultUtil.success("当前访问需要权限goods:get和goods:update");
    }

}